package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;

/**
 * 系统角色实体类
 * 
 * 功能特性：
 * - 支持角色名称和权限字符串管理
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持角色状态管理
 * - 支持数据权限范围控制
 * - 支持菜单和部门树选择关联显示控制
 * 
 * 业务说明：
 * - 角色管理是权限系统的核心组件
 * - 角色与用户是多对多关系
 * - 角色与菜单是多对多关系
 * - 角色与部门是多对多关系
 * - 角色权限字符串在同一租户内必须唯一
 * - 支持角色的启用和停用状态控制
 * 
 * 数据权限范围：
 * - 1：全部数据权限，可以查看所有数据
 * - 2：自定数据权限，可以查看自定义范围的数据
 * - 3：本部门数据权限，只能查看本部门的数据
 * - 4：本部门及以下数据权限，可以查看本部门及下级部门的数据
 * 
 * 关联关系：
 * - 与用户表：多对多关系，通过sys_user_role关联表
 * - 与菜单表：多对多关系，通过sys_role_menu关联表
 * - 与部门表：多对多关系，通过sys_role_dept关联表
 * - 与租户表：多对一关系，通过tenant_id关联
 * 
 * 数据约束：
 * - role_name：角色名称，必填
 * - role_key：角色权限字符串，在同一租户内唯一，必填
 * - role_sort：显示顺序，数值越小越靠前
 * - data_scope：数据范围，1-4之间的值
 * - status：角色状态，0=正常，1=停用
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_role")
public class SysRole extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 角色ID
     * 主键，自增长
     */
    @TableId("role_id")
    private Long roleId;

    /**
     * 角色名称
     * 角色显示名称，必填字段
     */
    @TableField("role_name")
    private String roleName;

    /**
     * 角色权限字符串
     * 角色唯一标识，在同一租户内必须唯一
     * 用于权限控制和角色识别
     */
    @TableField("role_key")
    private String roleKey;

    /**
     * 显示顺序
     * 角色在列表中的显示顺序，数值越小越靠前
     */
    @TableField("role_sort")
    private Integer roleSort;

    /**
     * 数据范围
     * 1：全部数据权限
     * 2：自定数据权限
     * 3：本部门数据权限
     * 4：本部门及以下数据权限
     */
    @TableField("data_scope")
    private String dataScope;

    /**
     * 菜单树选择项是否关联显示
     * true：关联显示，选择父菜单时自动选择子菜单
     * false：不关联显示，需要手动选择每个菜单
     */
    @TableField("menu_check_strictly")
    private Boolean menuCheckStrictly;

    /**
     * 部门树选择项是否关联显示
     * true：关联显示，选择父部门时自动选择子部门
     * false：不关联显示，需要手动选择每个部门
     */
    @TableField("dept_check_strictly")
    private Boolean deptCheckStrictly;

    /**
     * 角色状态
     * 0=正常，1=停用
     * 停用的角色不能被分配给用户
     */
    @TableField("status")
    private String status;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;
}